home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode New for 1.6 / CullGroupSample / Source / Process.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  13.4 KB  |  600 lines  |  [TEXT/CWIE]

  1. /****************************/
  2. /*       PROCESS.C             */
  3. /* By Brian Greenstone      */
  4. /****************************/
  5.  
  6.  
  7. /****************************/
  8. /*    EXTERNALS             */
  9. /****************************/
  10.  
  11. #include <QD3D.h>
  12. #include <QD3DGeometry.h>
  13. #include <QD3DGroup.h>
  14. #include <QD3DMath.h>
  15.  
  16. #include "myglobals.h"
  17. #include "objects.h"
  18. #include "mymenus.h"
  19. #include "mywindows.h"
  20. #include "myevents.h"
  21. #include "misc.h"
  22. #include "process.h"
  23. #include "qd3d_support.h"
  24. #include "3dmf.h"
  25.  
  26. extern    NewObjectDefinitionType    gNewObjectDefinition;
  27. extern    float                gFramesPerSecond;
  28.  
  29.  
  30. /****************************/
  31. /*    PROTOTYPES            */
  32. /****************************/
  33.  
  34. static void InitModelWindow(void);
  35. static void CalcBBox(TQ3Object theObject, TQ3BoundingBox    *bbox);
  36. static void BuildTriMeshTest(void);
  37. static void BuildBBoxOutline(TQ3DisplayGroupObject group, TQ3BoundingBox *bbox);
  38. static void MoveCamera(void);
  39. static void BuildSphereTest(void);
  40. static void BuildTorusTest(void);
  41.  
  42.  
  43. /****************************/
  44. /*    CONSTANTS             */
  45. /****************************/
  46.  
  47. #define    MODEL_WIND_ID            400
  48.  
  49.  
  50. /*********************/
  51. /*    VARIABLES      */
  52. /*********************/
  53.  
  54. WindowPtr                gModelWindow = nil;
  55. QD3DSetupOutputType        gModelViewInfo;
  56. TQ3DisplayGroupObject    gModelGroup[NUM_TEST] = {nil,nil,nil,nil,nil};
  57.  
  58. TQ3Point3D            gCameraFrom = { 0,0, .1 };
  59.  
  60. Boolean                gUseCullingGroups = kQ3True;
  61. Boolean                gShowBBoxes = kQ3True;
  62.  
  63. int                    gCurrentTest = TEST_TRIMESH;
  64.  
  65.  
  66. /******************** INIT TEST ************************/
  67.  
  68. void InitTest(void)
  69. {
  70.  
  71.             /* INIT THE WINDOW */
  72.             
  73.     InitModelWindow();
  74.  
  75.  
  76.             /* CREATE THE TEST MODEL */
  77.             
  78.     BuildCurrentTest();
  79.  
  80.     QD3D_CalcFramesPerSecond();
  81. }
  82.  
  83.  
  84.  
  85. /************** INIT MODEL WINDOW *******************/
  86.  
  87. static void InitModelWindow(void)
  88. {
  89. QD3DSetupInputType    viewDef;
  90. TQ3Point3D            cameraTo = { 0, 0, 0 };
  91. TQ3Vector3D            cameraUp = { 0.0, 1.0, 0 };
  92. TQ3ColorARGB        clearColor = {1,0,0,0};
  93. TQ3ColorRGB            ambientColor = { 1.0, 1.0, 1.0 };
  94. TQ3Vector3D            fillDirection1 = {1, -.3, -.8 };
  95. TQ3Vector3D            fillDirection2 = { -1, -.1, -.2 };
  96.  
  97.  
  98.             /* CREATE THE WINDOW */
  99.             
  100.     gModelWindow = GetNewCWindow(MODEL_WIND_ID, NIL_POINTER,MOVE_TO_FRONT);
  101.     if (gModelWindow == nil)
  102.         DoFatalAlert("\pWhere did the GameWindow window go?");                    
  103.     SetPort((GrafPtr)gModelWindow);
  104.  
  105.  
  106.             /***********************/
  107.             /* SET QD3D PARAMETERS */
  108.             /***********************/
  109.  
  110.     viewDef.view.displayWindow         = gModelWindow;
  111.     viewDef.view.rendererType         = kQ3RendererTypeInteractive;
  112.     viewDef.view.clearColor         = clearColor;
  113.     viewDef.view.paneClip.left         = 0;
  114.     viewDef.view.paneClip.right     = 0;
  115.     viewDef.view.paneClip.top         = 0;
  116.     viewDef.view.paneClip.bottom     = 0; 
  117.  
  118.     viewDef.styles.interpolation     = kQ3InterpolationStyleVertex; 
  119.     viewDef.styles.backfacing         = kQ3BackfacingStyleBoth;
  120.     viewDef.styles.fill                = kQ3FillStyleFilled; 
  121.     viewDef.styles.illuminationType    = kQ3IlluminationTypePhong; 
  122.  
  123.     viewDef.camera.from             = gCameraFrom;
  124.     viewDef.camera.to                 = cameraTo;
  125.     viewDef.camera.up                 = cameraUp;
  126.     viewDef.camera.hither             = 5;
  127.     viewDef.camera.yon                 = 1500;
  128.     viewDef.camera.fov                 = .9;
  129.  
  130.     viewDef.lights.ambientBrightness = 0.3;
  131.     viewDef.lights.ambientColor     = ambientColor;
  132.     viewDef.lights.numFillLights     = 2;
  133.     viewDef.lights.fillDirection[0] = fillDirection1;
  134.     viewDef.lights.fillDirection[1] = fillDirection2;
  135.     viewDef.lights.fillColor[0]     = ambientColor;
  136.     viewDef.lights.fillColor[1]     = ambientColor;
  137.     viewDef.lights.fillBrightness[0] = .8;
  138.     viewDef.lights.fillBrightness[1] = 0.4;
  139.  
  140.  
  141.     QD3D_SetupWindow(&viewDef, &gModelViewInfo);
  142.  
  143. }
  144.  
  145.  
  146. /******************** BUILD CURRENT TEST *************************/
  147.  
  148. void BuildCurrentTest(void)
  149. {
  150. ObjNode *newObj;
  151. float        x,y,z;
  152.     
  153.     switch(gCurrentTest)
  154.     {
  155.         case    TEST_TRIMESH:
  156.                 BuildTriMeshTest();
  157.                 break;
  158.  
  159.         case    TEST_SPHERE:
  160.                 BuildSphereTest();
  161.                 break;
  162.     
  163.         case    TEST_TORUS:
  164.                 BuildTorusTest();
  165.                 break;
  166.     
  167.         default:
  168.                 return;
  169.     }
  170.  
  171.  
  172.     DeleteAllObjects();
  173.  
  174.     for (x = -1000; x < 1000; x += 300)
  175.         for (y = -1000; y < 1000; y += 300)
  176.             for (z = -1000; z < 1000; z += 300)
  177.             {
  178.                         /* CREATE OBJNODE */
  179.                         
  180.                 gNewObjectDefinition.genre = DISPLAY_GROUP_GENRE;                
  181.                 gNewObjectDefinition.coord.x = x;
  182.                 gNewObjectDefinition.coord.y = y;
  183.                 gNewObjectDefinition.coord.z = z;
  184.                 gNewObjectDefinition.flags = OBJ_MODE_DRAW;
  185.                 gNewObjectDefinition.slot = 100;
  186.                 gNewObjectDefinition.moveCall = nil;
  187.                 newObj = MakeNewDisplayGroupObject(&gNewObjectDefinition);
  188.  
  189.                 AttachGeometryToDisplayGroupObject(newObj,gModelGroup[gCurrentTest]);
  190.  
  191.                 UpdateObjectTransforms(newObj);
  192.             }
  193.     
  194.     
  195.     DrawModelWindow();
  196.  
  197. }
  198.  
  199.  
  200. /******************* DRAW MODEL WINDOW *********************/
  201. //
  202. // Calls the support function QD3D_DrawScene.
  203. // It passes the view info and a pointer to the game draw callback.
  204. //
  205.  
  206. void DrawModelWindow(void)
  207. {
  208.     QD3D_DrawScene(&gModelViewInfo,(void *)DrawObjects);
  209. }
  210.  
  211.  
  212.  
  213. /*************** DO MODEL WINDOW NULL EVENT **********************/
  214.  
  215. void DoModelWindowNullEvent(void)
  216. {
  217.     QD3D_CalcFramesPerSecond();
  218.     MoveObjects();
  219.     MoveCamera();
  220.     DrawModelWindow();
  221. }
  222.  
  223.  
  224.  
  225. /****************** UPDATE MODEL WINDOW ******************/
  226. //
  227. // Called when there is an update event from the event manager
  228. //
  229.  
  230. void UpdateModelWindow(void)
  231. {
  232.     DrawModelWindow();    
  233. }
  234.  
  235.  
  236.  
  237.  
  238. /**************** MOVE CAMERA *****************/
  239.  
  240. static void MoveCamera(void)
  241. {
  242. TQ3Matrix4x4    m;
  243.  
  244.     Q3Matrix4x4_SetRotate_XYZ(&m,
  245.                      1.0f/gFramesPerSecond * .1f,    
  246.                      0,    
  247.                      1.1f/gFramesPerSecond * -.15f);    
  248.  
  249.     
  250.     Q3Point3D_Transform(&gCameraFrom, &m, &gCameraFrom);
  251.     QD3D_UpdateCameraFrom(&gModelViewInfo, &gCameraFrom);
  252. }
  253.  
  254.  
  255.  
  256.  
  257. /*********************** BUILD TRIMESH TEST **************************/
  258.  
  259. static void BuildTriMeshTest(void)
  260. {
  261. TQ3Object    obj;
  262. FSSpec        spec;
  263. TQ3DisplayGroupState    state;
  264. TQ3BoundingBox    bbox;
  265.  
  266.                 /* NUKE OLD ONE */
  267.             
  268.     if (gModelGroup[TEST_TRIMESH])
  269.         Q3Object_Dispose(gModelGroup[TEST_TRIMESH]);
  270.  
  271.  
  272.             /* LOAD TRIMESH FROM FILE */
  273.             
  274.     FSMakeFSSpec(0, 0, "\p:data:tree.3dmf", &spec);
  275. //    FSMakeFSSpec(0, 0, "\p:data:rex.3dmf", &spec);
  276.     obj = Load3DMFModel(&spec);
  277.         
  278.         
  279.             /* SEE IF OBJECT IS A GROUP ALREADY */
  280.         
  281.     if (Q3Object_IsType(obj,kQ3ShapeTypeGroup))
  282.     {
  283.         gModelGroup[TEST_TRIMESH] = obj;    
  284.     }
  285.     
  286.             /* MAKE NEW GROUP & PUT OBJ IN IT */
  287.     else
  288.     {                
  289.         gModelGroup[TEST_TRIMESH] = Q3DisplayGroup_New();
  290.         Q3Group_AddObject(gModelGroup[TEST_TRIMESH],obj);
  291.         Q3Object_Dispose(obj);
  292.     }
  293.     
  294.     
  295.             /* MAKE GROUP INLINE & ASSIGN BBOX */
  296.                 
  297.     if (gUseCullingGroups)
  298.     {        
  299.         Q3DisplayGroup_CalcAndUseBoundingBox(gModelGroup[TEST_TRIMESH],        // calc & set group's bbox
  300.                                             kQ3ComputeBoundsExact,
  301.                                             gModelViewInfo.viewObject);        
  302.         Q3DisplayGroup_GetState(gModelGroup[TEST_TRIMESH],&state);            // make inline
  303.         state |= kQ3DisplayGroupStateMaskIsInline;
  304.         Q3DisplayGroup_SetState(gModelGroup[TEST_TRIMESH],state);        
  305.     }    
  306.  
  307.     if (gShowBBoxes)
  308.     {
  309.         if (gUseCullingGroups)
  310.             Q3DisplayGroup_GetBoundingBox(gModelGroup[TEST_TRIMESH], &bbox);
  311.         else
  312.             CalcBBox(gModelGroup[TEST_TRIMESH], &bbox);
  313.         BuildBBoxOutline(gModelGroup[TEST_TRIMESH],&bbox);
  314.     }
  315. }
  316.  
  317.  
  318.  
  319. /**************** CALC BOUNDING BOX ***********************/
  320.  
  321. static void CalcBBox(TQ3Object theObject, TQ3BoundingBox    *bbox)
  322. {
  323. TQ3Status    status;
  324.  
  325.     status = Q3View_StartBoundingBox(gModelViewInfo.viewObject, kQ3ComputeBoundsExact);
  326.     if (status == kQ3Failure)
  327.         DoFatalAlert("\pCalcBBox: Q3View_StartBoundingBox");
  328.     do
  329.     {
  330.         status = Q3Object_Submit(theObject,gModelViewInfo.viewObject);
  331.         if (status == kQ3Failure)
  332.             DoFatalAlert("\pCalcBBox: Q3View_StartBoundingBox");
  333.  
  334.     }while(Q3View_EndBoundingBox(gModelViewInfo.viewObject, bbox) == kQ3ViewStatusRetraverse);
  335. }
  336.  
  337.  
  338.  
  339. /****************** BUILD BBOX OUTLINE **********************/
  340.  
  341. static void BuildBBoxOutline(TQ3DisplayGroupObject group, TQ3BoundingBox *bbox)
  342. {
  343. TQ3Object        line;
  344. TQ3PolyLineData    data;
  345. TQ3LineData        data2;
  346. TQ3Vertex3D        verts[5];
  347.  
  348.     data.numVertices = 5;
  349.     data.vertices = &verts[0];
  350.     data.segmentAttributeSet = nil;
  351.     data.polyLineAttributeSet = nil;
  352.     verts[0].attributeSet = nil;
  353.     verts[1].attributeSet = nil;
  354.     verts[2].attributeSet = nil;
  355.     verts[3].attributeSet = nil;
  356.  
  357.                 /* BACK */
  358.                 
  359.     verts[0].point = bbox->min;                // lower left far
  360.     verts[4] = verts[0];
  361.     
  362.     verts[1] = verts[0];
  363.     verts[1].point.x = bbox->max.x;            // lower right far
  364.     
  365.     verts[2] = verts[1];
  366.     verts[2].point.y = bbox->max.y;            // upper right far
  367.     
  368.     verts[3] = verts[2];
  369.     verts[3].point.x = bbox->min.x;                // upper left far
  370.  
  371.     line = Q3PolyLine_New(&data);            // make new polyline
  372.     Q3Group_AddObject(group,line);
  373.     Q3Object_Dispose(line);
  374.  
  375.                 /* FRONT */
  376.                 
  377.     verts[0].point = bbox->max;                // upper right near
  378.     verts[4] = verts[0];
  379.     
  380.     verts[1] = verts[0];
  381.     verts[1].point.x = bbox->min.x;            // upper left near
  382.     
  383.     verts[2] = verts[1];
  384.     verts[2].point.y = bbox->min.y;            // lower left near
  385.     
  386.     verts[3] = verts[2];
  387.     verts[3].point.x = bbox->max.x;            // lower right near
  388.  
  389.     line = Q3PolyLine_New(&data);            // make new polyline
  390.     Q3Group_AddObject(group,line);
  391.     Q3Object_Dispose(line);
  392.  
  393.  
  394.         /* LOWER LEFT SPAR */
  395.         
  396.     data2.lineAttributeSet = nil;
  397.     data2.vertices[0].attributeSet = nil;
  398.     data2.vertices[1].attributeSet = nil;
  399.     
  400.     data2.vertices[0].point = bbox->min;                    // lower left far
  401.     data2.vertices[1].point = data2.vertices[0].point;
  402.     data2.vertices[1].point.z = bbox->max.z;                // lower left near
  403.     
  404.     line = Q3Line_New(&data2);
  405.     Q3Group_AddObject(group,line);
  406.     Q3Object_Dispose(line);
  407.  
  408.  
  409.         /* LOWER RIGHT SPAR */
  410.             
  411.     data2.vertices[0].point.x = bbox->max.x;                    // lower right far
  412.     data2.vertices[1].point.x = data2.vertices[0].point.x;    // lower right near
  413.                     
  414.     line = Q3Line_New(&data2);
  415.     Q3Group_AddObject(group,line);
  416.     Q3Object_Dispose(line);
  417.  
  418.  
  419.         /* UPPER RIGHT SPAR */
  420.             
  421.     data2.vertices[0].point.y = bbox->max.y;                // upper right far
  422.     data2.vertices[1].point.y = data2.vertices[0].point.y;    // lower right near
  423.                     
  424.     line = Q3Line_New(&data2);
  425.     Q3Group_AddObject(group,line);
  426.     Q3Object_Dispose(line);
  427.  
  428.  
  429.         /* UPPER LEFT SPAR */
  430.             
  431.     data2.vertices[0].point.x = bbox->min.x;                // upper left far
  432.     data2.vertices[1].point.x = data2.vertices[0].point.x;    // lower left near
  433.                     
  434.     line = Q3Line_New(&data2);
  435.     Q3Group_AddObject(group,line);
  436.     Q3Object_Dispose(line);
  437.  
  438. }
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445. /*********************** BUILD SPHERE TEST **************************/
  446.  
  447. static void BuildSphereTest(void)
  448. {
  449. TQ3EllipsoidData    data;
  450. TQ3Object    obj;
  451. TQ3DisplayGroupState    state;
  452. TQ3BoundingBox    bbox;
  453.  
  454.                 /* NUKE OLD ONE */
  455.             
  456.     if (gModelGroup[TEST_SPHERE])
  457.         Q3Object_Dispose(gModelGroup[TEST_SPHERE]);
  458.  
  459.  
  460.             /* BUILD THE SPHERE */
  461.             
  462.     data.ellipsoidAttributeSet = nil;
  463.     data.interiorAttributeSet = nil;
  464.     data.origin.x = data.origin.y =    data.origin.z = 0;
  465.     data.orientation.x = 0;
  466.     data.orientation.y = 80;
  467.     data.orientation.z = 0;
  468.     data.majorRadius.x = 0;
  469.     data.majorRadius.y = 0;
  470.     data.majorRadius.z = 80;
  471.     data.minorRadius.x = 80;
  472.     data.minorRadius.y = 0;
  473.     data.minorRadius.z = 0;    
  474.     data.uMax = data.vMax = 1.0;
  475.     data.uMin = data.vMin = 0;
  476.     data.caps = kQ3EndCapNone;
  477.     
  478.     obj = Q3Ellipsoid_New(&data);
  479.     if (obj == nil)
  480.         DoFatalAlert("\pBuildSphereTest: Q3Ellipsoid_New");
  481.  
  482.         
  483.     
  484.             /* MAKE NEW GROUP & PUT OBJ IN IT */
  485.  
  486.     gModelGroup[TEST_SPHERE] = Q3DisplayGroup_New();
  487.     if (gModelGroup[TEST_SPHERE] == nil)
  488.         DoFatalAlert("\pBuildSphereTest: Q3DisplayGroup_New");
  489.     
  490.     Q3Group_AddObject(gModelGroup[TEST_SPHERE],obj);
  491.     Q3Object_Dispose(obj);
  492.     
  493.     
  494.     
  495.             /* MAKE GROUP INLINE & ASSIGN BBOX */
  496.                 
  497.     if (gUseCullingGroups)
  498.     {        
  499.         Q3DisplayGroup_CalcAndUseBoundingBox(gModelGroup[TEST_SPHERE],        // calc & set group's bbox
  500.                                             kQ3ComputeBoundsExact,
  501.                                             gModelViewInfo.viewObject);        
  502.         Q3DisplayGroup_GetState(gModelGroup[TEST_SPHERE],&state);            // make inline
  503.         state |= kQ3DisplayGroupStateMaskIsInline;
  504.         Q3DisplayGroup_SetState(gModelGroup[TEST_SPHERE],state);        
  505.     }    
  506.     
  507.     if (gShowBBoxes)
  508.     {
  509.         if (gUseCullingGroups)
  510.             Q3DisplayGroup_GetBoundingBox(gModelGroup[TEST_SPHERE], &bbox);
  511.         else
  512.             CalcBBox(gModelGroup[TEST_SPHERE], &bbox);
  513.         BuildBBoxOutline(gModelGroup[TEST_SPHERE],&bbox);
  514.     }
  515.     
  516. }
  517.  
  518.  
  519.  
  520.  
  521. /*********************** BUILD TORUS TEST **************************/
  522.  
  523. static void BuildTorusTest(void)
  524. {
  525. TQ3TorusData    data;
  526. TQ3Object    obj;
  527. TQ3DisplayGroupState    state;
  528. TQ3BoundingBox    bbox;
  529.  
  530.                 /* NUKE OLD ONE */
  531.             
  532.     if (gModelGroup[TEST_TORUS])
  533.         Q3Object_Dispose(gModelGroup[TEST_TORUS]);
  534.  
  535.  
  536.             /* BUILD THE SPHERE */
  537.             
  538.     data.torusAttributeSet = nil;
  539.     data.interiorAttributeSet = nil;
  540.     data.origin.x = data.origin.y =    data.origin.z = 0;
  541.     data.orientation.x = 0;
  542.     data.orientation.y = 50;
  543.     data.orientation.z = 0;
  544.     data.majorRadius.x = 0;
  545.     data.majorRadius.y = 0;
  546.     data.majorRadius.z = 40;
  547.     data.minorRadius.x = 80;
  548.     data.minorRadius.y = 0;
  549.     data.minorRadius.z = 0;
  550.     data.ratio = .4;
  551.     data.uMax = data.vMax = 1.0;
  552.     data.uMin = data.vMin = 0;
  553.     data.caps = kQ3EndCapNone;
  554.     
  555.     obj = Q3Torus_New(&data);
  556.     if (obj == nil)
  557.         DoFatalAlert("\pBuildTorusTest: Q3Torus_New");
  558.  
  559.         
  560.     
  561.             /* MAKE NEW GROUP & PUT OBJ IN IT */
  562.  
  563.     gModelGroup[TEST_TORUS] = Q3DisplayGroup_New();
  564.     if (gModelGroup[TEST_TORUS] == nil)
  565.         DoFatalAlert("\pBuildSphereTest: Q3DisplayGroup_New");
  566.     
  567.     Q3Group_AddObject(gModelGroup[TEST_TORUS],obj);
  568.     Q3Object_Dispose(obj);
  569.     
  570.     
  571.             /* MAKE GROUP INLINE & ASSIGN BBOX */
  572.                 
  573.     if (gUseCullingGroups)
  574.     {        
  575.         Q3DisplayGroup_CalcAndUseBoundingBox(gModelGroup[TEST_TORUS],        // calc & set group's bbox
  576.                                             kQ3ComputeBoundsExact,
  577.                                             gModelViewInfo.viewObject);        
  578.         Q3DisplayGroup_GetState(gModelGroup[TEST_TORUS],&state);            // make inline
  579.         state |= kQ3DisplayGroupStateMaskIsInline;
  580.         Q3DisplayGroup_SetState(gModelGroup[TEST_TORUS],state);        
  581.     }    
  582.  
  583.     if (gShowBBoxes)
  584.     {
  585.         if (gUseCullingGroups)
  586.             Q3DisplayGroup_GetBoundingBox(gModelGroup[TEST_TORUS], &bbox);
  587.         else
  588.             CalcBBox(gModelGroup[TEST_TORUS], &bbox);
  589.         BuildBBoxOutline(gModelGroup[TEST_TORUS],&bbox);
  590.     }
  591.  
  592. }
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.